You can define a new importer object by importing a subdirectory in GJS.
This is undocumented, but it is likely to at least hold until the whole
thing moves to ES6 modules, after which we'll be able to do this purely
in JS with Reflect.Loader.
Since this was the only thing the ShellJS library did, we can remove it
altogether.
This allows us to discontinue use of the gjs-internals-1.0 embedder API.
https://bugzilla.gnome.org/show_bug.cgi?id=772386
const Lang = imports.lang;
const Signals = imports.signals;
-const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
-const ShellJS = imports.gi.ShellJS;
const Config = imports.misc.config;
const FileUtils = imports.misc.fileUtils;
return extension;
}
-var _extension = null;
-
function installImporter(extension) {
- _extension = extension;
- ShellJS.add_extension_importer('imports.misc.extensionUtils._extension', 'imports', extension.path);
- _extension = null;
+ let oldSearchPath = imports.searchPath.slice(); // make a copy
+ imports.searchPath = [extension.path];
+ // importing a "subdir" creates a new importer object that doesn't affect
+ // the global one
+ extension.imports = imports['.'];
+ imports.searchPath = oldSearchPath;
}
const ExtensionFinder = new Lang.Class({
-DGNOME_SHELL_PKGLIBDIR=\"$(pkglibdir)\"
privlibdir = $(pkglibdir)
-privlib_LTLIBRARIES = libgnome-shell-js.la libgnome-shell-menu.la libgnome-shell.la
+privlib_LTLIBRARIES = libgnome-shell-menu.la libgnome-shell.la
noinst_LTLIBRARIES += libgnome-shell-base.la
shell_built_sources = \
# Here, and after, we repeat mutter and bluetooth libraries just for the rpath
# The dependency is already pulled in by libtool
-gnome_shell_LDADD = libgnome-shell.la libgnome-shell-js.la $(GNOME_SHELL_LIBS) $(MUTTER_LIBS)
+gnome_shell_LDADD = libgnome-shell.la $(GNOME_SHELL_LIBS) $(MUTTER_LIBS)
gnome_shell_LDFLAGS = -rpath $(MUTTER_TYPELIB_DIR)
gnome_shell_DEPENDENCIES = libgnome-shell.la
$(top_builddir)/js/js-resources.h \
$(NULL)
gnome_shell_extension_prefs_CPPFLAGS = $(gnome_shell_cflags)
-gnome_shell_extension_prefs_LDADD = libgnome-shell-js.la $(GNOME_SHELL_LIBS)
+gnome_shell_extension_prefs_LDADD = $(GNOME_SHELL_LIBS)
gnome_shell_extension_prefs_LDFLAGS = -rpath $(MUTTER_TYPELIB_DIR)
if HAVE_NETWORKMANAGER
$(top_builddir)/js/js-resources.h \
$(NULL)
gnome_shell_portal_helper_CPPFLAGS = $(gnome_shell_cflags)
-gnome_shell_portal_helper_LDADD = libgnome-shell-js.la $(GNOME_SHELL_LIBS)
+gnome_shell_portal_helper_LDADD = $(GNOME_SHELL_LIBS)
gnome_shell_portal_helper_LDFLAGS = -rpath $(MUTTER_TYPELIB_DIR)
endif
########################################
-libgnome_shell_js_la_SOURCES = \
- shell-js.h \
- shell-js.cpp \
- $(NULL)
-
-libgnome_shell_js_la_LIBADD = \
- $(GNOME_SHELL_JS_LIBS) \
- $(NULL)
-
-libgnome_shell_js_la_LDFLAGS = \
- -avoid-version
-
-libgnome_shell_js_la_CPPFLAGS = \
- $(GNOME_SHELL_JS_CFLAGS)
-
-########################################
-
shell_recorder_sources = \
shell-recorder.c \
shell-recorder.h
INTROSPECTION_GIRS += Shell-0.1.gir
CLEANFILES += Shell-0.1.gir
-ShellJS-0.1.gir: libgnome-shell-js.la
-ShellJS_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
-ShellJS_0_1_gir_LIBS = libgnome-shell-js.la
-ShellJS_0_1_gir_FILES = $(libgnome_shell_js_la_SOURCES)
-INTROSPECTION_GIRS += ShellJS-0.1.gir
-CLEANFILES += ShellJS-0.1.gir
-
St-1.0.gir: libst-1.0.la
St_1_0_gir_INCLUDES = Clutter-1.0 Gtk-3.0
St_1_0_gir_CFLAGS = $(st_cflags) -DST_COMPILATION
#include <gjs/gjs.h>
#include <glib/gi18n.h>
-#include "shell-js.h"
-
int
main (int argc, char *argv[])
{
return 0;
}
-
-
-/* HACK:
- Add a dummy function that calls into libgnome-shell-js.so to ensure it's
- linked to /usr/bin/gnome-shell-extension-prefs even when linking with
- --as-needed. This function is never actually called.
- https://bugzilla.gnome.org/show_bug.cgi?id=670477
-*/
-void _shell_link_to_shell_js (void);
-
-void
-_shell_link_to_shell_js (void)
-{
- shell_js_add_extension_importer (NULL, NULL, NULL, NULL);
-}
#include "shell-global.h"
#include "shell-global-private.h"
-#include "shell-js.h"
#include "shell-perf-log.h"
#include "st.h"
return ecode;
}
-
-/* HACK:
- Add a dummy function that calls into libgnome-shell-js.so to ensure it's
- linked to /usr/bin/gnome-shell even when linking with --as-needed.
- This function is never actually called.
- https://bugzilla.gnome.org/show_bug.cgi?id=670477
-*/
-void _shell_link_to_shell_js (void);
-
-void
-_shell_link_to_shell_js (void)
-{
- shell_js_add_extension_importer (NULL, NULL, NULL, NULL);
-}
+++ /dev/null
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-
-#include "config.h"
-
-#include "shell-js.h"
-
-#include <gio/gio.h>
-#include <gjs/gjs.h>
-#include <gjs/gjs-module.h>
-
-/**
- * shell_js_add_extension_importer:
- * @target_object_script: JavaScript code evaluating to a target object
- * @target_property: Name of property to use for importer
- * @directory: Source directory:
- * @error: A #GError
- *
- * This function sets a property named @target_property on the object
- * resulting from the evaluation of @target_object_script code, which
- * acts as a GJS importer for directory @directory.
- *
- * Returns: %TRUE on success
- */
-gboolean
-shell_js_add_extension_importer (const char *target_object_script,
- const char *target_property,
- const char *directory,
- GError **error)
-{
- JS::Value target_object;
- GList *contexts;
- JSContext *context;
- char *search_path[2] = { 0, 0 };
- gboolean ret = FALSE;
-
- /* Take the first GjsContext from all of them --
- * we should only ever have one context, so this
- * should be alright. */
- contexts = gjs_context_get_all ();
- context = (JSContext*) gjs_context_get_native_context ((GjsContext*)contexts->data);
- g_list_free_full (contexts, g_object_unref);
-
- JS_BeginRequest (context);
-
- /* This is a bit of a hack; ideally we'd be able to pass our target
- * object directly into this function, but introspection doesn't
- * support that at the moment. Instead evaluate a string to get it. */
- if (!JS_EvaluateScript(context,
- gjs_get_global_object (context),
- target_object_script,
- strlen (target_object_script),
- "<target_object_script>",
- 0,
- &target_object))
- {
- gjs_log_exception(context);
- g_set_error(error,
- G_IO_ERROR,
- G_IO_ERROR_FAILED,
- "Unable to import %s", target_object_script);
- goto out;
- }
-
- if (!target_object.isObject ())
- {
- g_error ("shell_js_add_extension_importer: invalid target object");
- goto out;
- }
-
- search_path[0] = (char*)directory;
- gjs_define_importer (context, &target_object.toObject (), target_property,
- (const char **)search_path, FALSE);
- ret = TRUE;
-
- out:
- JS_EndRequest (context);
- return ret;
-}
+++ /dev/null
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-#ifndef __SHELL_JS_H__
-#define __SHELL_JS_H__
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-gboolean shell_js_add_extension_importer (const char *target_object_script,
- const char *target_property,
- const char *directory,
- GError **error);
-
-G_END_DECLS
-
-#endif /* __SHELL_JS_H__ */